package cn.mazexal.exambg.common.models;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 金额
 *
 * @author Lay
 * @date 2024/7/24
 */
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Amount implements Serializable {
    /**
     * 金额
     */
    private BigDecimal value;

    public Amount(BigDecimal value) {
        // 金额保留四位小数，四位小数后面的直接舍弃
        this.value = value.setScale(4, RoundingMode.DOWN);
    }

    /**
     * 通过 double 类型构造金额
     *
     * @param amount 金额
     * @return 金额对象
     */
    public static Amount of(double amount) {
        return new Amount(BigDecimal.valueOf(amount));
    }

    public int compare(Amount amount) {
        return value.compareTo(amount.getValue());
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Amount && value.equals(((Amount) obj).value);
    }

    @Override
    public String toString() {
        return this.value.toPlainString();
    }

    /**
     * 判断金额是否为负数
     *
     * @return true: 负数
     */
    public boolean isNegative() {
        return value.compareTo(BigDecimal.ZERO) < 0;
    }

    /**
     * 判断金额是否为正数
     *
     * @return true: 正数
     */
    public boolean isPositive() {
        return value.compareTo(BigDecimal.ZERO) > 0;
    }

    /**
     * 判断金额是否为零
     *
     * @return true: 零
     */
    public boolean isZero() {
        return value.compareTo(BigDecimal.ZERO) == 0;
    }

    /**
     * 反转金额
     *
     * @return 反转后的金额
     */
    public Amount negate() {
        return new Amount(value.negate());
    }

    /**
     * 转分单位
     *
     * @return 金额分单位
     */
    public Integer toCents() {
        return value.multiply(new BigDecimal("100")).intValue();
    }

    /**
     * 从分单位构造
     *
     * @param cents 金额分单位
     * @return 金额对象
     */
    public static Amount ofCents(int cents) {
        return of(cents / 100.0);
    }
}
